#include <brpc/server.h>
#include <butil/logging.h>

#include "main.pb.h"


//封装EchoServer 创建一个子类，实现rpc的业务
//服务器实现了 Echo 方法，在收到请求后对 EchoRequest 进行处理，生成 EchoResponse 并返回给客户端。
class EchoServiceImpl : public example::EchoService
{
    public:
    EchoServiceImpl(){}
    ~EchoServiceImpl(){}
    // done: done 由框架创建，递给服务回调，包含了调用服务回调后的后续
    // 动作，包括检查 response 正确性，序列化，打包，发送等逻辑。不管成功失败， 
    // done->Run()必须在请求处理完成后被用户调用一次
    void Echo(google::protobuf::RpcController *controller,
              const ::example::EchoRequest *request,
              ::example::EchoResponse *response,
              ::google::protobuf::Closure *done)
    {
        //RAII的机制释放done
        brpc::ClosureGuard rpc_guard(done);

        std::cout << "收到了消息" << request->message() << std::endl;

        std::string str = request->message() + "---这是响应";
        response->set_message(str);
    }
};


int main(int argc,char* argv[])
{
    //将brpc本身的日志信息关闭掉
    logging::LoggingSettings settings;
    settings.logging_dest = logging::LoggingDestination::LOG_TO_NONE;
    logging::InitLogging(settings);

    //创建服务器对象
    brpc::Server server;
    //将服务添加到服务器中
    EchoServiceImpl echo_service;
    //brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE：这是一个枚举值，指示服务器是否拥有传入的服务对象的生命周期控制权。
    //SERVER_DOESNT_OWN_SERVICE：服务器不拥有该服务对象的所有权，因此服务的生命周期由你自己管理。这意味着你负责创建并销毁 echo_service 对象
    //SERVER_OWNS_SERVICE：如果选择此选项，bRPC 服务器会负责销毁服务对象。当服务器关闭时，它会自动清理并释放服务实例的内存
    int ret = server.AddService(&echo_service,brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE);
    if(ret == -1) {
        std::cout << "添加rpc服务失败\n";
        return -1;
    }

    //启动服务器
    brpc::ServerOptions options;
    //连接空闲超时时间，-1表示
    options.idle_timeout_sec = -1;
    //io线程数量
    options.num_threads = 1;
    ret = server.Start(8080,&options);
    if(ret == -1) {
        std::cout << "启动服务器失败\n";
        return -1;
    }

    //服务器运行，直到被要求退出
    server.RunUntilAskedToQuit();

    return 0;
}